
class Person{
    // 一、声明实例属性和方法
    public name:string;//es7中给类声明一个实例属性
    public age:number=12;//声明属性同时赋值。

    private sex:string = "男";//private修饰的属性和方法，只能在类的内部使用

    protected knowledge:string = "";//protected修饰的属性和方法，只能在类的内部或者子类的内部使用

    eat(){
        console.log(this.name);        
    }

    // 二、声明类的属性和方法，使用static关键字
    public static count:number  = 0;

    public static show(){

    }

    private static num:number = 10;
    

    constructor(){
        // 不能在构造函数里声明属性。可以赋值。
        this.name = "晨光";//这是赋值
    }

}

let p1 = new Person();

p1.name;//实例属性
p1.eat();//实例方法
// p1.sex;//不行，因为，sex是私有的（private）；

p1.knowledge;//不行，因为，knowledge受保护的的（protected）

Person.count = 20;//类的属性。
Person.show();//类的方法

// Person.num//不行，因为，num是私有的（private）；

class Programmer extends Person {
    constructor() {
        super();        
    }

    writeCode(){
        console.log(this.knowledge);//父类中用protected修饰的属性可以在子类中使用，
        
    }
}


